package com.example.sunming.redisLock;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @description:
 * @date: 2020/12/11
 * @author: sunming
 */
@Component
@Slf4j
public class ScheduleLock {

    /**
     * 用在定时任务方法上，锁的key为test_lock，指定了超时时间为2秒钟
     * 锁的级别为默认的应用级别（LockRangeEnum.APPLICATION），在这个如果应用启动了多个容器运行，在只会有一个容器获取到锁，
     * 自动释放锁为false，即方法执行完成后，也不会自动释放锁，只有到超时时间了，锁才会释放
     */
    @Scheduled(cron = "0 0/1 * * * ? ")
    @EmLock(key = "test_lock", timeout = 2, timeUnit = TimeUnit.SECONDS, autoRelease = false)
    public void recordUpdateTask() {
        log.info("执行任务.......");
    }

    /**
     * 用在普通的方法上，锁的key为method_Lock，指定了超时时间为1分钟，
     * 锁的级别为默认的线程级别，在该应用内多个线程执行该方法，则只会有一个线程获取到锁
     * 如果启动了多个应用容器，同样多个容器内的所有线程，也只会有一个线程获取到锁
     */
    @EmLock(key = "method_Lock", timeout = 1, timeUnit = TimeUnit.MINUTES, lockRange = LockRangeEnum.THREAD)
    public void recordUpdate() {
        log.info("执行任务2.......");
    }
}
